package com.ophiux.utils.image;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;

import javax.imageio.ImageIO;

import org.springframework.util.Base64Utils;

import net.coobird.thumbnailator.Thumbnails;

/**
 * @desc:图片合并
 * @author hhl
 * @date: 2022/05/09 上午11:03:35
 */
public class ImageMergeUtil {

	public void ddd(Graphics g,int fontSize) {
		Font fTxtBottom = new Font("微软雅黑", Font.PLAIN, fontSize);
		Color myColorTxtBottom = Color.BLACK; // 图片颜色
		g.setColor(myColorTxtBottom);
		g.setFont(fTxtBottom);
		
//		FontMetrics fm = g2d.getFontMetrics(fTxtBottom);
//		String text = "重庆医科大学附属第一人民医院";
//		int textWidth = fm.stringWidth(text);
//		int widthX = (backImgNewWidth - textWidth) / 2;
//		
//		g.drawString("陌生人，您好！", backImgNewWidth / 2, backImgNewHeight / 3);
	}

	public static void main(String[] args) {
		try {
			String serverUploadImgUrl = "C:\\Users\\Admin\\Desktop"; // 图片保存路径

			// 背景图片 （注：此图片来源于网络）
			String backImgUrlStr = "http://bbsfiles.vivo.com.cn/vivobbs/attachment/forum/201601/24/175433rossj7cn74vksn4p.jpg";
			InputStream backImgUrl = new URL(backImgUrlStr).openStream();
//            BufferedImage backImg = ImageIO.read(backImgUrl);

			// 背景图片
			File bgImgFile = new File("E://doctor-bg.png");
			BufferedImage backImg = ImageIO.read(bgImgFile);

			// 要合并的图片 （注：此图片来源于网络）
			String imgUrlStr = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQG-7jwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyTVhoeXhGa1FjU20xamhRU3h5Y3AAAgTdMnZiAwT0AQAA";
			InputStream imgUrl = new URL(imgUrlStr).openStream();
			BufferedImage img = ImageIO.read(imgUrl);

			int backImgNewWidth = backImg.getWidth();// 背景图片宽度
			int backImgNewHeight = backImg.getHeight();// 背景图片高度度
			// 生成新的合并的图片（调整图片的大小）
			int imgNewWidth = 670;// backImgNewWidth / 2;
			// BufferedImage imgNew = new BufferedImage(图片宽度, 图片高度, 图像类型);
			BufferedImage imgNew = new BufferedImage(imgNewWidth, imgNewWidth, BufferedImage.TYPE_INT_ARGB);
			Graphics2D g2d = imgNew.createGraphics();
			g2d.drawImage(img, 0, 0, imgNew.getWidth(), imgNew.getHeight(), null);
			g2d.dispose();

			// 两图片合并
			int imgNewWidthPosition = (backImgNewWidth - imgNewWidth) / 2;
			int imgNewHeightPosition = (backImgNewHeight - imgNewWidth) / 2 + 10;

			Graphics g = backImg.getGraphics(); // backImg（注意
			// g.drawImage(图片, x 位置, y 位置, null);
			g.drawImage(imgNew, imgNewWidthPosition, imgNewHeightPosition, null); // 把 imgNew，整合在 backImg 里面
//            g.dispose();

			// 最后一个参数用来设置字体的大小（文字放在 liunx，可能会乱码，那是因为服务器上没有这个字体，要上传，自行百度）
			Font fTxtBottom = new Font("微软雅黑", Font.PLAIN, 50);
			Color myColorTxtBottom = Color.BLACK; // 图片颜色
			g.setColor(myColorTxtBottom);
			g.setFont(fTxtBottom);
//            g.drawString(文字, x 位置, y 位置);
			FontMetrics fm = g2d.getFontMetrics(fTxtBottom);
			String text = "重庆医科大学附属第一人民医院";
			int textWidth = fm.stringWidth(text);
			int widthX = (backImgNewWidth - textWidth) / 2;
			g.drawString(text, widthX, backImgNewHeight / 8);
			
			Font fTxtBottom2 = new Font("微软雅黑", Font.PLAIN, 60);
			Color myColorTxtBottom2 = Color.BLACK; // 图片颜色
			g.setColor(myColorTxtBottom2);
			g.setFont(fTxtBottom2);
			FontMetrics fm2 = g2d.getFontMetrics(fTxtBottom2);
			String text2 = "王晓明";
			int textWidth2 = fm2.stringWidth(text2);
			int widthX2 = (backImgNewWidth - textWidth2) / 2;
			g.drawString(text2, widthX2, backImgNewHeight / 8 +150);
			
            Font fTxtBottom3 = new Font("微软雅黑", Font.BOLD, 50);
            Color myColorTxtBottom3 = Color.BLACK;  //图片颜色
            g.setColor(myColorTxtBottom3);
            g.setFont(fTxtBottom3);
			FontMetrics fm3 = g2d.getFontMetrics(fTxtBottom3);
			String text3 = "扫 码 开 启 规 范 化 慢 病 管 理";
			int textWidth3 = fm3.stringWidth(text3);
			int widthX3 = (backImgNewWidth - textWidth3) / 2;
            g.drawString(text3, widthX3, backImgNewHeight-200);

            
			g.dispose(); // 调这个方法就是开始这个整合 （可以多张图片，多个文字整合成一张图片，只有把他们放在这方法里面就行）

			String imgName = new Date().getTime() + ".jpg"; // 生成的图片名称
			File newFile = new File(serverUploadImgUrl, imgName); // 生成新的图片
//			// 此处要写PNG否则可能会出现遮罩层
			ImageIO.write(backImg, "png", newFile);
			
			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            ImageIO.write(backImg, "jpg", outputStream);
            byte[] data = outputStream.toByteArray();
            System.out.println(data.length);
            
            data = compressPicForScale(data, "adfsdf",100L,0.5f,1.0);
            System.out.println(data.length);
            String base64Img = Base64Utils.encodeToString(outputStream.toByteArray());
            
            System.out.println("本地图片转换Base64: data:image/jpg;base64," + base64Img);
            

		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("结束");
	}
	
	
	/**
	 * 根据指定大小压缩图片
	 *
	 * @param imageBytes 源图片字节数组
	 * @param filename   文件名字
	 * @return
	 */
	public static byte[] compressPicForScale(byte[] imageBytes, String filename) {
		return compressPicForScale(imageBytes, filename, 300L);
	}

	/**
	 * 根据指定大小压缩图片
	 *
	 * @param imageBytes  源图片字节数组
	 * @param filename    文件名字
	 * @param desFileSize 指定图片大小，单位kb
	 * @return
	 */
	public static byte[] compressPicForScale(byte[] imageBytes, String filename, long desFileSize) {
		return compressPicForScale(imageBytes, filename, desFileSize, 1.0);
	}

	/**
	 * 根据指定大小压缩图片
	 *
	 * @param imageBytes  源图片字节数组
	 * @param filename    文件名字
	 * @param desFileSize 指定图片大小，单位kb
	 * @param quality     是输出图片的质量 0-1，即：清晰度/分辨率。
	 * @return
	 */
	public static byte[] compressPicForScale(byte[] imageBytes, String filename, long desFileSize, Double quality) {
		return compressPicForScale(imageBytes, filename, desFileSize, 0.5f, 0.5);
	}
	
	/**
	 * 根据指定大小压缩图片
	 *
	 * @param imageBytes  源图片字节数组
	 * @param filename    文件名字
	 * @param desFileSize 指定图片大小，单位kb
	 * @param scale       图片缩小比例 0-1
	 * @param quality     是输出图片的质量 0-1，即：清晰度/分辨率。
	 * @return
	 */
	public static byte[] compressPicForScale(byte[] imageBytes, String filename, long desFileSize, double scale, Double quality) {
		if (imageBytes == null || imageBytes.length <= 0 || imageBytes.length < desFileSize * 1024) {
			return imageBytes;
		}
		long srcSize = imageBytes.length;
		try {
			ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
			ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
			Thumbnails.of(inputStream).scale(scale).outputQuality(quality).toOutputStream(outputStream);
			imageBytes = outputStream.toByteArray();
			System.out.println("【图片压缩】imageId="+filename+" | 图片原大小="+srcSize / 1024+"kb | 压缩后大小="+imageBytes.length / 1024+"kb");
		} catch (Exception e) {
		}
		return imageBytes;
	}
}
